﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.Serialization;

namespace Galaxy.ModuleInterface.Messages.Source
{
    /// <summary>Именованный источник</summary>
    [DebuggerDisplay("Сообщение от = {ModuleName}")]
    [Serializable]
    public class CNamedSource : INamedSource, ISource, ICloneable, ISerializable
    {
        /* ---------------------------------------------------------------------- */

        /// <summary>Имя источника</summary>
        private string f_SourceModuleName;

        /* ---------------------------------------------------------------------- */

        /// <summary>Имя модуля источника</summary>
        public string ModuleName { get { return f_SourceModuleName; } }

        /* ---------------------------------------------------------------------- */

        /// <summary>Новый именованный источник</summary>
        /// <param name="ModuleName">Имя модуля-источника</param>
        public CNamedSource(string ModuleName)
        {
            f_SourceModuleName = ModuleName;
        }

        /// <summary>Новый именованый источник</summary>
        /// <param name="Module">Модуль-источник</param>
        public CNamedSource(IGalaxyModule Module)
        {
            f_SourceModuleName = Module.Name;
        }

        /// <summary>Новый именованый источник сообщения из сериализационного контекста</summary>
        /// <param name="info">Сериализационная информация</param>
        /// <param name="context">Контекст сериализации</param>
        protected CNamedSource(SerializationInfo info, StreamingContext context)
        {
            f_SourceModuleName = info.GetString("SourceName");
        }

        /* ---------------------------------------------------------------------- */

        /// <summary>Проверка на эквивалентность с объектом</summary>
        /// <param name="obj">проеряемый объект</param>
        /// <returns>Истина, если объект - модуль Галактики и его имя совпадает с именем источника</returns>
        public override bool Equals(object obj)
        {
            if( obj is IGalaxyModule )
                return ( obj as IGalaxyModule ).Name == f_SourceModuleName;

            return base.Equals(obj);
        }

        /// <summary>Получить ХЭШ-код</summary>
        /// <returns>Получить ХЭШ-код</returns>
        public override int GetHashCode()
        {
            return f_SourceModuleName.GetHashCode();
        }

        /// <summary>Преобразовать в строковый вид</summary>
        /// <returns>Строковый вид</returns>
        public override string ToString()
        {
            return f_SourceModuleName;
        }

        /* ---------------------------------------------------------------------- */

        /// <summary>Клонировать</summary>
        /// <returns>Новый именованный источник сообщения</returns>
        public object Clone() { return this.MemberwiseClone(); }

        /* ---------------------------------------------------------------------- */

        #region ISerializable Members

        /// <summary>Получить сериализационную информацию</summary>
        /// <param name="info">Сериализационная информация</param>
        /// <param name="context">Сериализационный контекст</param>
        public virtual void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
        {
            info.AddValue("SourceName", this.ModuleName);
        }

        #endregion
    }
}
